home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAERecording.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  29.9 KB  |  1,223 lines  |  [TEXT/CWIE]

  1. // SVAERecording.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAERecording.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVEditUtils.h"
  11. #include "SVAEWindowUtils.h"
  12. #include "SVAETextUtils.h"
  13. #include "SVAppleEvents.h"
  14.  
  15. #include <AEPackObject.h>
  16.  
  17.  
  18.  
  19. static short   gBigBrother;
  20. static char    *gTypingBuffer;
  21. static short   gCharsInBuffer;
  22. static AEDesc  gTypingTargetObject;
  23.  
  24. OSErr    InstallRecordingHandlers(void)
  25. {
  26.     OSErr    err;
  27.     
  28.     gBigBrother = 0;
  29.     gCharsInBuffer = 0;
  30.     gTypingBuffer = (char *)NewPtr(32000);
  31.     gTypingTargetObject.dataHandle = 0;
  32.     
  33.     err = AEInstallEventHandler( kCoreEventClass, kAENotifyStartRecording, NewAEEventHandlerProc(HandleStartRecording), noRefCon, false);
  34.     err = AEInstallEventHandler( kCoreEventClass, kAENotifyStopRecording, NewAEEventHandlerProc(HandleStopRecording), noRefCon, false);
  35.  
  36.     return(err);
  37. }
  38.  
  39. pascal OSErr HandleStartRecording(const AppleEvent *theAppleEvent,
  40.                                                           AppleEvent *reply,
  41.                                                           long       handlerRefCon)        
  42. {
  43. #pragma unused (reply,handlerRefCon)
  44.  
  45.     OSErr myErr;
  46.  
  47.     gBigBrother++;
  48.  
  49.     myErr = GotRequiredParams(theAppleEvent);
  50.  
  51.     return(myErr);
  52.     
  53. } // HandleStartRecording
  54.  
  55. pascal OSErr HandleStopRecording(const AppleEvent *theAppleEvent,
  56.                                                          AppleEvent *reply,
  57.                                                              long handlerRefCon)        
  58. {
  59. #pragma unused (theAppleEvent,reply,handlerRefCon)
  60.  
  61.     gBigBrother--;
  62.     return(noErr);
  63. } // HandleStopRecording
  64.  
  65.  
  66. // Make an object specifier for a window given the WindowPtr
  67.  
  68. OSErr    MakeWindowObj(WindowPtr theWindow, AEDesc *result)
  69. {
  70.     AEDesc    nullDesc = {typeNull, NULL},
  71.             absoluteDesc = {typeNull, NULL};
  72.     long    windowIndex;
  73.     OSErr    err;
  74.     
  75.     windowIndex = GetNthWindowOfWindowPtr(theWindow);
  76.     if (! windowIndex)
  77.         return(errAENoSuchObject);
  78.     
  79.     err = AECreateDesc(typeInteger,(Ptr)&windowIndex, sizeof(windowIndex), &absoluteDesc);
  80.     if (noErr != err) goto done;
  81.     
  82.     err = CreateObjSpecifier(cWindow, &nullDesc, formAbsolutePosition,
  83.                                                 &absoluteDesc, false, result);
  84.  
  85. done:
  86.     if (absoluteDesc.dataHandle)
  87.         AEDisposeDesc(&absoluteDesc);
  88.     
  89.     return(err);
  90. } // MakeWindowObj
  91.  
  92. // Make an object specifier for a document given the WindowPtr
  93.  
  94. OSErr    MakeDocumentObj(WindowPtr theWindow, AEDesc *result)
  95. {
  96.     AEDesc    nullDesc = {typeNull, NULL},
  97.             absoluteDesc = {typeNull, NULL};
  98.     long    windowIndex;
  99.     OSErr    err;
  100.     
  101.     windowIndex = GetNthWindowOfWindowPtr(theWindow);
  102.     if (! windowIndex)
  103.         return(errAENoSuchObject);
  104.     
  105.     err = AECreateDesc(typeInteger,(Ptr)&windowIndex, sizeof(windowIndex), &absoluteDesc);
  106.     if (noErr != err) goto done;
  107.     
  108.     err = CreateObjSpecifier(cDocument, &nullDesc, formAbsolutePosition,
  109.                                                 &absoluteDesc, false, result);
  110.  
  111. done:
  112.     if (absoluteDesc.dataHandle)
  113.         AEDisposeDesc(&absoluteDesc);
  114.     
  115.     return(err);
  116. } // MakeDocumentObj
  117.  
  118.  
  119. OSErr    MakeTextObjFromToken(TextToken* theToken, AEDesc* result)
  120. {
  121.     OSErr    err;
  122.  
  123.     err = GetTextTokenObjectSpecifier(theToken, result);
  124.     
  125.     return(err);
  126. }
  127.  
  128.  
  129. OSErr    MakeSelectedTextObj(WindowPtr theWindow, TEHandle theTextEditHandle, AEDesc* result)
  130. {
  131.     return( MakeTextObj(theWindow, (**theTextEditHandle).selStart,
  132.                             (**theTextEditHandle).selEnd, result));
  133. } // MakeSelectedTextObj
  134.  
  135.  
  136. OSErr    MakeTextObj(WindowPtr theWindow, short selStart, short selEnd, AEDesc* result)
  137. {
  138.     TextToken    aToken;
  139.     OSErr        err;
  140.     
  141.     aToken.tokenWindow = theWindow;
  142.     aToken.tokenOffset = selStart + 1;
  143.     aToken.tokenLength = selEnd - selStart;
  144.  
  145.     err = MakeTextObjFromToken(&aToken, result);
  146.  
  147.     return(err);
  148. }
  149.  
  150. OSErr    SendSelectionEvent(DPtr docPtr)
  151. {
  152.     AEAddressDesc    ourAddress = {typeNull, NULL};
  153.     AppleEvent        selectEvent = {typeNull, NULL},
  154.                     ignoreReply = {typeNull, NULL};
  155.     AEDesc            textObj = {typeNull, NULL};
  156.     OSErr            err;
  157.  
  158.  
  159.     err = MakeSelfAddress(&ourAddress);
  160.     if (noErr != err) goto done;
  161.     
  162.         // Build an object to represent the current document's selection
  163.         // MakeSelectedTextObj
  164.     err = MakeSelectedTextObj(docPtr->theWindow, docPtr->theText, &textObj);
  165.     if (noErr != err) goto done;
  166.     
  167.     err = AECreateAppleEvent(kAEMiscStandards, kAESelect, &ourAddress, 0, 0, &selectEvent);    
  168.     if (noErr != err) goto done;
  169.     
  170.         // add parameter
  171.     err = AEPutParamDesc(&selectEvent, keyDirectObject, &textObj);
  172.     if (noErr != err) goto done;
  173.                     
  174.         // and now send the message
  175.     err = AESend(&selectEvent, &ignoreReply, kAENoReply, kAEHighPriority, kAEDefaultTimeout, NULL, NULL);
  176.     if (noErr != err) goto done;
  177.  
  178. done:    
  179.     if (ourAddress.dataHandle) 
  180.         AEDisposeDesc(&ourAddress);
  181.     if (selectEvent.dataHandle) 
  182.         AEDisposeDesc(&selectEvent);
  183.     if (ignoreReply.dataHandle) 
  184.         AEDisposeDesc(&ignoreReply);
  185.     if (textObj.dataHandle) 
  186.         AEDisposeDesc(&textObj);
  187.  
  188.     return(err);
  189. }
  190.  
  191. void    DoEditCommand(DPtr theDocument, editCommandType whatCommand)
  192. {
  193.     AEAddressDesc    ourAddress = {typeNull, NULL};
  194.     AppleEvent        editCommandEvent = {typeNull, NULL},
  195.                     ignoreReply = {typeNull, NULL};
  196.     AEEventID        theEventID;
  197.     AEEventClass    theEventClass;
  198.     OSErr            err;
  199.     
  200.     err = SendSelectionEvent(theDocument);
  201.     if (noErr != err) goto done;
  202.  
  203.         // Now create and send the appropriate cut, copy, paste or clear AppleEvent
  204.     
  205.     switch (whatCommand)
  206.     {
  207.         case  editCutCommand:
  208.             theEventID = kAECut;
  209.             theEventClass = kAEMiscStandards;
  210.             break;
  211.             
  212.         case  editCopyCommand:
  213.             theEventID = kAECopy;
  214.             theEventClass = kAEMiscStandards;
  215.             break;
  216.  
  217.         case  editPasteCommand:
  218.             theEventID = kAEPaste;
  219.             theEventClass = kAEMiscStandards;
  220.             break;
  221.  
  222.         case  editClearCommand:
  223.             theEventID = kAEDelete;
  224.             theEventClass = kAECoreSuite;
  225.             break;
  226.     }
  227.     
  228.     err = MakeSelfAddress(&ourAddress);
  229.     if (noErr != err) goto done;
  230.             
  231.     err = AECreateAppleEvent(theEventClass, theEventID, &ourAddress, 0, 0, &editCommandEvent);    
  232.     if (noErr != err) goto done;
  233.             
  234.         // and now Send the message
  235.     err = AESend(&editCommandEvent, &ignoreReply, kAENoReply, kAEHighPriority, kAEDefaultTimeout, NULL, NULL);
  236.         
  237. done:
  238.     if (ourAddress.dataHandle) 
  239.         AEDisposeDesc(&ourAddress);
  240.     if (editCommandEvent.dataHandle) 
  241.         AEDisposeDesc(&editCommandEvent);
  242.     if (ignoreReply.dataHandle) 
  243.         AEDisposeDesc(&ignoreReply);
  244.  
  245. } // DoEditCommand
  246.  
  247. void    IssueCutCommand(DPtr theDocument)
  248. {            
  249.     DoEditCommand(theDocument, editCutCommand);
  250.  
  251. void    IssueCopyCommand(DPtr theDocument)
  252. {
  253.     DoEditCommand(theDocument, editCopyCommand);
  254. }
  255.  
  256. void    IssuePasteCommand(DPtr theDocument)
  257. {
  258.     DoEditCommand(theDocument, editPasteCommand);    
  259. }
  260.  
  261. void    IssueClearCommand(DPtr theDocument)
  262. {
  263.     DoEditCommand(theDocument, editClearCommand);    
  264. }
  265.  
  266. // ---------------------------------------------------------------------
  267. //    Name :         SendAESetObjProp
  268. //    Function :    Creates a property object from an object,
  269. //                a property type and its data and sends it to
  270. //                the requested address, and cleans up zapping params too
  271. // ---------------------------------------------------------------------
  272.  
  273. OSErr    SendAESetObjProp(AEDesc *theObj, DescType theProp, AEDesc *theData, AEAddressDesc *toWhom)
  274. {
  275.     AEDesc        propObjSpec;
  276.     AppleEvent    myAppleEvent;
  277.     AppleEvent    defReply;
  278.     OSErr        myErr;
  279.     OSErr        ignoreErr;
  280.     AEDesc        theProperty;
  281.         
  282.     // create an object spec that represents the property of the given object
  283.     
  284.     myErr = AECreateDesc(typeType, (Ptr)&theProp, sizeof(theProp), &theProperty);
  285.     if (myErr==noErr)
  286.         myErr = CreateObjSpecifier(cProperty, theObj, formPropertyID,
  287.                                         &theProperty, true, &propObjSpec);    
  288.         
  289.     // create event
  290.     
  291.     if (myErr==noErr)
  292.         myErr = AECreateAppleEvent(kAECoreSuite, kAESetData, toWhom, 0, 0, &myAppleEvent);
  293.         
  294.     // add prop obj spec to the event
  295.     
  296.     if (myErr==noErr)
  297.         myErr = AEPutParamDesc(&myAppleEvent, keyDirectObject, &propObjSpec);
  298.     
  299.     // add prop data to the event
  300.     
  301.     if (myErr==noErr)
  302.         myErr = AEPutParamDesc(&myAppleEvent,keyAEData, theData);
  303.     
  304.     // send event
  305.     
  306.     if (myErr==noErr)
  307.         myErr = AESend(&myAppleEvent, &defReply, kAENoReply+kAEAlwaysInteract,
  308.                                     kAENormalPriority, kAEDefaultTimeout, nil, nil);
  309.     
  310.     if (myAppleEvent.dataHandle)
  311.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  312.         
  313.     if (&propObjSpec.dataHandle)
  314.       ignoreErr = AEDisposeDesc(&propObjSpec);
  315.     
  316.     if (theData->dataHandle)
  317.         ignoreErr = AEDisposeDesc(theData);
  318.     
  319.     if (toWhom->dataHandle)
  320.         ignoreErr = AEDisposeDesc(toWhom);
  321.     
  322.     return(myErr);
  323. } // SendAESetObjProp
  324.  
  325.  
  326. void    IssueFontCommand(DPtr theDocument, short theItem)
  327. {
  328.     Str255            name;
  329.     AEDesc            strDesc;
  330.     AEAddressDesc    theAddress;
  331.     AEDesc            selTextObj;
  332.     OSErr            err;
  333.         
  334.     err = MakeSelfAddress(&theAddress);
  335.     
  336.     err = MakeSelectedTextObj(theDocument->theWindow, theDocument->theText, &selTextObj);
  337.     
  338.     GetItem(myMenus[fontM], theItem, name);
  339.     
  340.     if (err==noErr)
  341.         err  = AECreateDesc(typeChar, (Ptr)&name[1], name[0], &strDesc);
  342.     
  343.     if (err==noErr)
  344.         err  = SendAESetObjProp(&selTextObj, pFont, &strDesc, &theAddress);                                                            
  345. }
  346.  
  347. // Window property routines
  348.  
  349. void    IssueZoomCommand(WindowPtr whichWindow, short whichPart)
  350. {
  351.     Boolean       zoomBool;
  352.     AEDesc        zoomDesc;
  353.     AEAddressDesc selfAddr;
  354.     AEDesc        frontWinObj;
  355.     OSErr         err;
  356.  
  357.     err = MakeSelfAddress(&selfAddr);
  358.     
  359.     err = MakeWindowObj(whichWindow, &frontWinObj);
  360.     
  361.     zoomBool = (whichPart==inZoomOut);
  362.  
  363.     err = AECreateDesc(typeBoolean, (Ptr)&zoomBool, sizeof(zoomBool), &zoomDesc);
  364.                                             
  365.     err = SendAESetObjProp(&frontWinObj, pIsZoomed, &zoomDesc, &selfAddr);                                                            
  366. } // IssueZoomCommand
  367.  
  368. void    IssueCloseCommand(WindowPtr whichWindow)
  369. {
  370.     AEAddressDesc  selfAddr;
  371.     AEDesc         frontWinObj;
  372.     OSErr          err;
  373.     OSErr          ignoreErr;
  374.     AppleEvent     closeCommandEvent;
  375.     AppleEvent     ignoreReply;
  376.  
  377.     frontWinObj.dataHandle = nil;
  378.     
  379.     err = MakeSelfAddress(&selfAddr);
  380.     
  381.     err = MakeWindowObj(whichWindow, &frontWinObj);
  382.                                                         
  383.     err = AECreateAppleEvent( kAECoreSuite, kAEClose, &selfAddr, 0, 0, &closeCommandEvent) ;                
  384.     
  385.     // add parameter - the window to close    
  386.     if (err==noErr) 
  387.         err = AEPutParamDesc(&closeCommandEvent, keyDirectObject, &frontWinObj);
  388.         
  389.     if (err==noErr) 
  390.         err = AESend(&closeCommandEvent,&ignoreReply,kAENoReply+kAEAlwaysInteract,kAEHighPriority,10000,nil, nil);
  391.     
  392.     if (closeCommandEvent.dataHandle) 
  393.         ignoreErr = AEDisposeDesc(&closeCommandEvent);
  394.     
  395.     if (selfAddr.dataHandle) 
  396.         ignoreErr = AEDisposeDesc(&selfAddr);
  397.         
  398.     if (frontWinObj.dataHandle) 
  399.         ignoreErr = AEDisposeDesc(&frontWinObj);
  400.         
  401. } // IssueCloseCommand
  402.  
  403. void    IssueSizeWindow(WindowPtr whichWindow, short newHSize, short newVSize)
  404. {
  405.     Rect          sizeRect;
  406.     Rect          contentRect;
  407.     short         edgeSize;
  408.     AEDesc        sizeDesc;
  409.     AEAddressDesc selfAddr;
  410.     AEDesc        frontWinObj;
  411.     OSErr         err;
  412.  
  413.     sizeRect    = (**(((WindowPeek)whichWindow)->strucRgn)).rgnBBox;
  414.     contentRect = (**(((WindowPeek)whichWindow)->contRgn)).rgnBBox;
  415.     
  416.     edgeSize = sizeRect.right-sizeRect.left-(contentRect.right-contentRect.left);
  417.     sizeRect.right = sizeRect.left+newHSize+edgeSize;
  418.     
  419.     edgeSize = sizeRect.bottom-sizeRect.top-(contentRect.bottom-contentRect.top);
  420.     sizeRect.bottom = sizeRect.top+newVSize+edgeSize;
  421.     
  422.     err = MakeSelfAddress(&selfAddr);
  423.     
  424.     err = MakeWindowObj(whichWindow, &frontWinObj);
  425.     
  426.     if (err==noErr)
  427.         err = AECreateDesc(typeQDRectangle, (Ptr)&sizeRect, sizeof(sizeRect), &sizeDesc);
  428.     
  429.     if (err==noErr)
  430.         err  = SendAESetObjProp(&frontWinObj, pBounds, &sizeDesc, &selfAddr);                                                            
  431. } // IssueSizeWindow
  432.  
  433. void    IssueMoveWindow(WindowPtr whichWindow, Rect sizeRect)
  434. {
  435.     AEDesc        sizeDesc;
  436.     AEAddressDesc selfAddr;
  437.     AEDesc        frontWinObj;
  438.     OSErr         err;
  439.  
  440.     err = MakeSelfAddress(&selfAddr);
  441.     
  442.     err = MakeWindowObj(whichWindow, &frontWinObj);
  443.         
  444.     if (err==noErr)
  445.         err = AECreateDesc(typeQDRectangle, (Ptr)&sizeRect, sizeof(sizeRect), &sizeDesc);
  446.     
  447.     if (err==noErr)        
  448.         err = SendAESetObjProp(&frontWinObj, pBounds, &sizeDesc, &selfAddr);                                                            
  449. } // IssueMoveWindow
  450.  
  451. void    IssuePageSetupWindow(WindowPtr whichWindow, TPrint thePageSetup)
  452. {
  453.     AEDesc        sizeDesc;
  454.     AEAddressDesc selfAddr;
  455.     AEDesc        frontWinObj;
  456.     OSErr         err;
  457.  
  458.     err = MakeSelfAddress(&selfAddr);
  459.     
  460.     err = MakeWindowObj(whichWindow, &frontWinObj);
  461.     
  462.     if (err==noErr)
  463.         err = AECreateDesc(typeTPrint, (Ptr)&thePageSetup, sizeof(thePageSetup), &sizeDesc);
  464.                                              
  465.     if (err==noErr)
  466.         err = SendAESetObjProp(&frontWinObj, pPageSetup, &sizeDesc, &selfAddr);                                                            
  467.                                                  
  468. } //IssuePageSetupWindow
  469.  
  470.  
  471. void IssueGXPageSetupWindow(WindowPtr whichWindow, gxJob thGXJob)
  472. {
  473.     AEDesc        sizeDesc;
  474.     AEAddressDesc selfAddr;
  475.     AEDesc        frontWinObj;
  476.     OSErr         err;
  477.     Handle        thePGXHandle;
  478.  
  479.     // Flatten the gxJob to a handle
  480.  
  481.     thePGXHandle = NewHandle(0);
  482.     GXFlattenJobToHdl(thGXJob, thePGXHandle);
  483.  
  484.     err = MakeSelfAddress(&selfAddr);
  485.     
  486.     err = MakeWindowObj(whichWindow, &frontWinObj);
  487.     
  488.     if (err==noErr)
  489.         err = AECreateDesc(typeTPrint, (Ptr)*thePGXHandle,
  490.                                 GetHandleSize (thePGXHandle), &sizeDesc);
  491.                                              
  492.     if (err==noErr)
  493.         err = SendAESetObjProp(&frontWinObj, pGXPageSetup, &sizeDesc, &selfAddr);                                                            
  494.  
  495.     DisposeHandle( thePGXHandle );                                             
  496. } // IssueGXPageSetupWindow
  497.  
  498.  
  499. void IssuePrintWindow(WindowPtr whichWindow, Boolean useDialog)
  500. {
  501.     AEAddressDesc selfAddr;
  502.     AEDesc        frontWinObj;
  503.     OSErr         err;
  504.     OSErr         ignoreErr;
  505.     AppleEvent    printCommandEvent;
  506.     AppleEvent    ignoreReply;
  507.     AESendMode    sendModeFlags;
  508.  
  509.     err = MakeSelfAddress(&selfAddr);
  510.     
  511.     err = MakeWindowObj(whichWindow, &frontWinObj);
  512.                                                         
  513.     err = AECreateAppleEvent(kCoreEventClass, kAEPrintDocuments, &selfAddr, 0, 0, &printCommandEvent) ;                
  514.  
  515.     //    add parameter - the window to print
  516.  
  517.     if (err==noErr) 
  518.         err = AEPutParamDesc(&printCommandEvent, keyDirectObject, &frontWinObj);
  519.         
  520.     if (err==noErr)
  521.     {
  522.         sendModeFlags = kAENoReply;
  523.         if (useDialog)
  524.             sendModeFlags = sendModeFlags + kAEAlwaysInteract;
  525.         else
  526.             sendModeFlags = sendModeFlags + kAENeverInteract;
  527.         err = AESend(&printCommandEvent,&ignoreReply,sendModeFlags,kAEHighPriority,10000,nil, nil);
  528.     }
  529.     
  530.     if (printCommandEvent.dataHandle)
  531.         ignoreErr = AEDisposeDesc(&printCommandEvent);
  532.     
  533.     if (frontWinObj.dataHandle) 
  534.         err = AEDisposeDesc(&frontWinObj);
  535.         
  536.     if (selfAddr.dataHandle) 
  537.         err = AEDisposeDesc(&selfAddr);
  538.         
  539. } // IssuePrintWindow
  540.  
  541. OSErr    IssueAEOpenDoc(FSSpec myFSSpec)
  542. // send OpenDocs AppleEvent to myself, with a one-element list
  543. // containing the given file spec
  544. //
  545. // NOTES : the core AEOpenDocs event is defined as taking a list of
  546. //        aliases (not file specs) as its direct parameter.  However,
  547. //        we can send the file spec instead and depend on AppleEvents'
  548. //        automatic coercion.  In fact, we don't really even have to put 
  549. //        in a list; AppleEvents will coerce a descriptor into a 1-element
  550. //        list if called for.  In this routine, though, we'll make the
  551. //        list for demonstration purposes.
  552. {
  553.     AppleEvent    myAppleEvent;
  554.     AppleEvent    defReply;
  555.     AEDescList    docList;
  556.     AEAddressDesc selfAddr;
  557.     OSErr         myErr;
  558.     OSErr         ignoreErr;
  559.     
  560.     myAppleEvent.dataHandle = nil;
  561.     docList.dataHandle  = nil;
  562.     selfAddr.dataHandle = nil;
  563.     defReply.dataHandle = nil;
  564.         
  565.     //    Create empty list and add one file spec
  566.  
  567.     myErr = AECreateList(nil,0,false, &docList);
  568.     
  569.     if (myErr==noErr) 
  570.         myErr = AEPutPtr(&docList,1,typeFSS,(Ptr)&myFSSpec,sizeof(myFSSpec));
  571.         
  572.     //    Create a self address to send it to
  573.  
  574.     if (myErr==noErr) 
  575.         myErr = MakeSelfAddress(&selfAddr);
  576.         
  577.     if (myErr==noErr) 
  578.         myErr = AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments, &selfAddr,
  579.                                 kAutoGenerateReturnID,  kAnyTransactionID, &myAppleEvent);
  580.  
  581.     //    Put Params into our event and send it
  582.  
  583.     if (myErr == noErr) 
  584.         myErr = AEPutParamDesc(&myAppleEvent, keyDirectObject, &docList);
  585.  
  586.     myErr = AESend(&myAppleEvent, &defReply, kAENoReply+kAEAlwaysInteract, kAENormalPriority,
  587.                                                                      kAEDefaultTimeout, nil, nil);
  588.         
  589.     if (selfAddr.dataHandle) 
  590.         ignoreErr = AEDisposeDesc(&selfAddr);
  591.         
  592.     if (myAppleEvent.dataHandle) 
  593.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  594.         
  595.     if (docList.dataHandle) 
  596.         ignoreErr = AEDisposeDesc(&docList);
  597.         
  598.     return(myErr);
  599.     
  600. } // IssueAEOpenDoc
  601.  
  602. void    IssueAENewWindow(void)
  603. // send the New Element event to myself with a null container
  604. {
  605.     AppleEvent    myAppleEvent;
  606.     AppleEvent    defReply;
  607.     AEAddressDesc selfAddr;
  608.     OSErr         myErr;
  609.     OSErr         ignoreErr;
  610.     DescType      elemClass;
  611.     
  612.     myAppleEvent.dataHandle = nil;
  613.     
  614.     //    Create the address of us
  615.     
  616.     myErr = MakeSelfAddress(&selfAddr);
  617.     
  618.     //    create event 
  619.     
  620.     myErr = AECreateAppleEvent(kAECoreSuite, kAECreateElement, &selfAddr,
  621.                                     kAutoGenerateReturnID, kAnyTransactionID, &myAppleEvent);
  622.     
  623.     //    attach desired class of new element
  624.     
  625.     elemClass = cWindow;
  626.     
  627.     if (myErr == noErr) 
  628.         myErr = AEPutParamPtr(&myAppleEvent, keyAEObjectClass, typeType,
  629.                                         (Ptr)&elemClass, sizeof(elemClass));
  630.         
  631.     //    send the event 
  632.     
  633.     if (myErr == noErr) 
  634.         myErr = AESend(&myAppleEvent, &defReply, kAENoReply+kAENeverInteract,
  635.                             kAENormalPriority, kAEDefaultTimeout, nil, nil);
  636.     //    Clean up - reply never created so don't throw away
  637.  
  638.     if (selfAddr.dataHandle) 
  639.         ignoreErr = AEDisposeDesc(&selfAddr);
  640.         
  641.     if (myAppleEvent.dataHandle) 
  642.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  643.                 
  644. } // IssueAENewWindow
  645.  
  646. OSErr    IssueSaveCommand(WindowPtr theWindow, FSSpecPtr where)
  647. // send an AppleEvent Save Event to myself
  648. {
  649.     AEDesc        windowObj;
  650.     AppleEvent    myAppleEvent;
  651.     AppleEvent    defReply;
  652.     OSErr         myErr;
  653.     OSErr         ignoreErr;
  654.     AEAddressDesc selfAddr;
  655.         
  656.     windowObj.dataHandle = nil;
  657.     myAppleEvent.dataHandle = nil;
  658.     
  659.     myErr = MakeWindowObj(theWindow, &windowObj);
  660.             
  661.     if (myErr==noErr) 
  662.         myErr = MakeSelfAddress(&selfAddr);
  663.     
  664.         //    Build event
  665.  
  666.     if (myErr == noErr) 
  667.         myErr = AECreateAppleEvent(kAECoreSuite, kAESave, &selfAddr,
  668.                             kAutoGenerateReturnID, kAnyTransactionID, &myAppleEvent);
  669.   
  670.         //    say which window
  671.  
  672.     if (myErr==noErr) 
  673.         myErr = AEPutParamDesc(&myAppleEvent, keyDirectObject, &windowObj);
  674.  
  675.         //    add optional file param if we need to
  676.  
  677.     if (where) 
  678.         if (myErr==noErr) 
  679.             myErr = AEPutParamPtr(&myAppleEvent, keyAEDestination, typeFSS,
  680.                                                     (Ptr)where, sizeof(FSSpec));
  681.     
  682.         // send the event
  683.  
  684.     if (myErr==noErr) 
  685.         myErr  = AESend(&myAppleEvent, &defReply, kAENoReply+kAENeverInteract,
  686.                                     kAENormalPriority, kAEDefaultTimeout, nil, nil);
  687.       
  688.     if (selfAddr.dataHandle) 
  689.         ignoreErr = AEDisposeDesc(&selfAddr);
  690.       
  691.     if (windowObj.dataHandle) 
  692.         ignoreErr = AEDisposeDesc(&windowObj);
  693.         
  694.     if (myAppleEvent.dataHandle) 
  695.         myErr = AEDisposeDesc(&myAppleEvent);
  696.         
  697.     return(myErr);
  698. }    // IssueSaveCommand
  699.  
  700. OSErr    IssueRevertCommand(WindowPtr theWindow)
  701.     // send an AppleEvent Revert Event to myself
  702. {
  703.     AEDesc        windowObj;
  704.     AppleEvent    myAppleEvent;
  705.     AppleEvent    defReply;
  706.     OSErr         myErr;
  707.     OSErr         ignoreErr;
  708.     AEAddressDesc selfAddr;
  709.     
  710.     windowObj.dataHandle = nil;
  711.     myAppleEvent.dataHandle = nil;
  712.     
  713.     myErr = MakeWindowObj(theWindow, &windowObj);
  714.                 
  715.     if (myErr==noErr) 
  716.         myErr = MakeSelfAddress(&selfAddr);
  717.         
  718.     // Build event
  719.     
  720.     if (myErr == noErr) 
  721.         myErr  = AECreateAppleEvent(kAEMiscStandards, kAERevert, &selfAddr,
  722.                                     kAutoGenerateReturnID, kAnyTransactionID, &myAppleEvent);
  723.     // say which window
  724.     
  725.     if (myErr == noErr) 
  726.         myErr = AEPutParamDesc(&myAppleEvent, keyDirectObject, &windowObj);
  727.     //    send the event
  728.  
  729.     if (myErr==noErr) 
  730.         myErr  = AESend(&myAppleEvent, &defReply, kAENoReply+kAENeverInteract,
  731.                                 kAENormalPriority, kAEDefaultTimeout, nil, nil);
  732.         
  733.     if (windowObj.dataHandle) 
  734.         ignoreErr = AEDisposeDesc(&windowObj);
  735.         
  736.     if (myAppleEvent.dataHandle) 
  737.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  738.         
  739.     if (selfAddr.dataHandle) 
  740.         ignoreErr = AEDisposeDesc(&selfAddr);
  741.         
  742.     return(myErr);
  743. } // IssueRevertCommand
  744.  
  745. // ----------------------------------------------------
  746. //    Name :         IssueQuitCommand
  747. //    Purpose :    Sends self a Quit AppleEvent
  748. // ----------------------------------------------------
  749. OSErr    IssueQuitCommand(void)
  750. {
  751.     AppleEvent    myAppleEvent;
  752.     AppleEvent    defReply;
  753.     OSErr         myErr;
  754.     OSErr         ignoreErr;
  755.     AEAddressDesc selfAddr;
  756.     DescType      mySaveOpt;
  757.     
  758.     myAppleEvent.dataHandle = nil;
  759.     selfAddr.dataHandle     = nil;
  760.                         
  761.     myErr = MakeSelfAddress(&selfAddr);
  762.         
  763.     //    Build event
  764.     
  765.     if (myErr == noErr) 
  766.         myErr  = AECreateAppleEvent(kCoreEventClass, kAEQuitApplication, &selfAddr,
  767.                                         kAutoGenerateReturnID, kAnyTransactionID, &myAppleEvent);
  768.     //    say which save option
  769.     
  770.     mySaveOpt = kAEAsk;
  771.     
  772.     if (myErr == noErr) 
  773.         myErr = AEPutParamPtr(&myAppleEvent, keyAESaveOptions, typeEnumerated,
  774.                                                 (Ptr)&mySaveOpt, sizeof(mySaveOpt));
  775.     //    send the event
  776.  
  777.     if (myErr==noErr) 
  778.         myErr  = AESend(&myAppleEvent, &defReply, kAENoReply+kAEAlwaysInteract,
  779.                                     kAENormalPriority, kAEDefaultTimeout, nil, nil);
  780.                     
  781.     if (myAppleEvent.dataHandle) 
  782.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  783.         
  784.     if (selfAddr.dataHandle) 
  785.         ignoreErr = AEDisposeDesc(&selfAddr);
  786.         
  787.     return(myErr);
  788. } // IssueQuitCommand
  789.  
  790. #define kOK 1
  791. #define kCancel 2
  792. #define kOtherSize 4
  793. #define kOutlineItem 5
  794.  
  795. Boolean    PoseSizeDialog(long *whatSize)
  796. {
  797.     GrafPtr   savedPort;
  798.     DialogPtr aDialog;
  799.     Str255    aString;
  800.     short     itemHit;
  801.  
  802.     GetPort(&savedPort);
  803.     aDialog = GetNewDialog(1004, nil, (WindowPtr)-1);
  804.     ShowWindow(aDialog);
  805.     SetPort(aDialog);
  806.     
  807.     AdornDefaultButton(aDialog, kOutlineItem);
  808.      
  809.         //set the edittext button to contain the right size
  810.     NumToString(*whatSize, aString);
  811.     SetText(aDialog, kOtherSize, aString);
  812.  
  813.     do
  814.     {
  815.         ModalDialog(nil, &itemHit);
  816.     } while ((itemHit!=kOK) && (itemHit!=kCancel));
  817.     
  818.     if (itemHit == kOK) 
  819.         RetrieveText(aDialog, kOtherSize, aString);
  820.  
  821.     DisposDialog(aDialog);
  822.     SetPort(savedPort);
  823.     
  824.     if (itemHit == kOK) 
  825.     {
  826.         // set the new size of the text
  827.         StringToNum(aString, whatSize);
  828.         if ((*whatSize<1) || (*whatSize>2000)) 
  829.             *whatSize = 12;
  830.     }
  831.  
  832.     return(itemHit == kOK);
  833. }
  834.  
  835. void    IssueSizeCommand(DPtr theDocument,short theItem)
  836. {
  837.     Str255        name;
  838.     AEDesc        sizeDesc;
  839.     AEAddressDesc theAddress;
  840.     OSErr         err;
  841.     AEDesc        selTextObj;
  842.     
  843.         // Vars to do with menu processing
  844.     short     lastSize;
  845.     short     upItem;
  846.     short     downItem;
  847.     short     otherItem;
  848.     long      theSize;
  849.     TextStyle theStyle;
  850.     short     lineHeight;
  851.     short     fontAscent;
  852.         
  853.     err = MakeSelfAddress(&theAddress);
  854.     
  855.     err = MakeSelectedTextObj(theDocument->theWindow, theDocument->theText, &selTextObj);        
  856.  
  857.         // check if the item is on the Size menu
  858.         // remembering that we can add and delete items from it
  859.     lastSize  = CountMItems(myMenus[sizeM]) - 5;
  860.     upItem    = lastSize + 2;
  861.     downItem  = upItem + 1;
  862.     otherItem = downItem + 2;
  863.   
  864.     TEGetStyle((**(theDocument->theText)).selStart, &theStyle, &lineHeight,
  865.                                             &fontAscent, theDocument->theText);
  866.     
  867.     GetItem(myMenus[sizeM], theItem, name);
  868.  
  869.     if (theItem <= lastSize)
  870.     {
  871.         GetItem(myMenus[sizeM], theItem, name);
  872.         StringToNum(name, &theSize);
  873.     }
  874.     else if (theItem == upItem)  
  875.         theSize = theStyle.tsSize + 1;
  876.     else if (theItem == downItem)
  877.         theSize = theStyle.tsSize - 1;
  878.     else if (theItem == otherItem) 
  879.     {
  880.         theSize = theStyle.tsSize;
  881.         if (!PoseSizeDialog(&theSize))
  882.             return;
  883.     }
  884.  
  885.     if (err==noErr)
  886.         err = CreateOffsetDescriptor(theSize, &sizeDesc);
  887.     
  888.     if (err==noErr)
  889.         err = SendAESetObjProp(&selTextObj, pPointSize, &sizeDesc, &theAddress);
  890. } // IssueSizeCommand
  891.  
  892. void    IssueStyleCommand(DPtr theDocument, short theItem)
  893. {
  894.     Style         theFace;
  895.     OSErr         err;
  896.     AEDesc        result;
  897.     AEAddressDesc selfAddr;
  898.     AEDesc        selTextObj;
  899.     TextStyle     theStyle;
  900.     short         lineHeight;
  901.     short         fontAscent;
  902.         
  903.     TEGetStyle((**(theDocument->theText)).selStart, &theStyle,
  904.                     &lineHeight, &fontAscent, theDocument->theText);
  905.     
  906.     theFace = 0;
  907.  
  908.     switch (theItem)
  909.     {
  910.         case cPlain:
  911.             theFace = 0;
  912.             break;
  913.         case cBold:
  914.             theFace = bold;
  915.             break;
  916.         case cItalic:
  917.             theFace = italic;
  918.             break;
  919.         case cUnderline:
  920.             theFace = underline;
  921.             break;
  922.         case cOutline:
  923.             theFace = outline;
  924.             break;
  925.         case cShadow:
  926.             theFace = shadow;
  927.             break;
  928.         case cCondense:
  929.             theFace = condense;
  930.             break;
  931.         case cExtend:
  932.             theFace = extend;
  933.             break;
  934.     } // of switch
  935.  
  936.     if (theFace==0)
  937.         err = BuildTypeTextStylesDesc(0, bold+italic+underline+outline+shadow+condense+extend, &result);
  938.     else if (theFace & theStyle.tsFace)
  939.         err = BuildTypeTextStylesDesc(0, theFace, &result);
  940.     else
  941.         err = BuildTypeTextStylesDesc(theFace, 0, &result);
  942.     
  943.     err = MakeSelfAddress(&selfAddr);
  944.     
  945.     if (err==noErr)
  946.         err = MakeSelectedTextObj(theDocument->theWindow, theDocument->theText, &selTextObj);
  947.     
  948.     if (err==noErr)
  949.         err = SendAESetObjProp(&selTextObj, pTextStyles, &result, &selfAddr);
  950. } // IssueStyleCommand
  951.  
  952.  
  953. OSErr    IssueSetDataObjToBufferContents(const AEDesc* theObj)
  954.     OSErr            myErr;
  955.     OSErr            ignoreErr;
  956.     AEAddressDesc    theAddress;
  957.     AppleEvent        myAppleEvent;
  958.     AppleEvent        defReply;
  959.  
  960.     myErr = MakeSelfAddress(&theAddress);
  961.     
  962.     // create event
  963.     
  964.     if (myErr==noErr)
  965.         myErr = AECreateAppleEvent(kAECoreSuite, kAESetData, &theAddress,
  966.                                                         0, 0, &myAppleEvent);
  967.         
  968.     // add prop obj spec to the event
  969.     
  970.     if (myErr==noErr)
  971.         myErr = AEPutParamDesc(&myAppleEvent, keyDirectObject, theObj);
  972.     
  973.     // add prop data to the event
  974.     
  975.     if (myErr==noErr)
  976.         myErr = AEPutParamPtr(&myAppleEvent, keyAEData, typeChar,
  977.                                     (Ptr)gTypingBuffer, gCharsInBuffer);
  978.                                                     
  979.     // send event
  980.     
  981.     if (myErr==noErr)
  982.      if (gRecordingImplemented)
  983.          myErr = AESend(&myAppleEvent, &defReply, kAENoReply+kAEDontExecute,
  984.                                      kAENormalPriority, kAEDefaultTimeout, nil, nil);
  985.  
  986.     if (theAddress.dataHandle)
  987.         ignoreErr = AEDisposeDesc(&theAddress);
  988.         
  989.     if (myAppleEvent.dataHandle)
  990.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  991.         
  992.     return(myErr);
  993. }
  994.  
  995. void    AddKeyToTypingBuffer(DPtr theDocument, char theKey)
  996. {
  997.     OSErr myErr;
  998.     OSErr ignoreErr;
  999.     
  1000.     if (theKey==BS || theKey==FS || theKey==GS || theKey==RS || theKey==US)
  1001.     {
  1002.         FlushAndRecordTypingBuffer();
  1003.         if (theKey==BS)
  1004.         {
  1005.             if ((**theDocument->theText).selStart!=(**theDocument->theText).selEnd)
  1006.             {
  1007.                 myErr = MakeTextObj(theDocument->theWindow,
  1008.                                     (**theDocument->theText).selStart,
  1009.                                     (**theDocument->theText).selEnd,
  1010.                                     &gTypingTargetObject);
  1011.             }
  1012.             else
  1013.             {
  1014.                 myErr = MakeTextObj(theDocument->theWindow,
  1015.                                     (**theDocument->theText).selStart-1,
  1016.                                     (**theDocument->theText).selStart,
  1017.                                     &gTypingTargetObject);
  1018.             }
  1019.                 
  1020.             myErr = IssueSetDataObjToBufferContents(&gTypingTargetObject);
  1021.             
  1022.             ignoreErr = AEDisposeDesc(&gTypingTargetObject);
  1023.             
  1024.             gTypingTargetObject.dataHandle = nil;
  1025.         }
  1026.     }
  1027.     else
  1028.     {
  1029.         if (gCharsInBuffer==0)
  1030.             myErr = MakeSelectedTextObj(theDocument->theWindow, theDocument->theText,
  1031.                                                                     &gTypingTargetObject);
  1032.  
  1033.         gTypingBuffer[gCharsInBuffer++] = theKey;
  1034.     }
  1035. }
  1036.  
  1037. void    FlushAndRecordTypingBuffer(void)
  1038.     OSErr  myErr;
  1039.     OSErr  ignoreErr;
  1040.  
  1041.     if (gCharsInBuffer != 0)
  1042.     {
  1043.         myErr = IssueSetDataObjToBufferContents(&gTypingTargetObject);
  1044.         
  1045.         if (gTypingTargetObject.dataHandle)
  1046.             ignoreErr = AEDisposeDesc(&gTypingTargetObject);
  1047.     }
  1048.         
  1049.     gCharsInBuffer = 0;
  1050.     gTypingTargetObject.dataHandle = 0;
  1051. }
  1052.  
  1053.     
  1054. void    StyleTokConst(short theStyleItem, DescType *thekConst)
  1055. {
  1056.     switch (theStyleItem)
  1057.     {
  1058.         case bold:
  1059.             *thekConst = kAEBold;
  1060.             break;
  1061.             
  1062.         case italic:
  1063.             *thekConst = kAEItalic;
  1064.             break;
  1065.             
  1066.         case underline:
  1067.             *thekConst = kAEUnderline;
  1068.             break;
  1069.             
  1070.         case outline:
  1071.             *thekConst = kAEOutline;
  1072.             break;
  1073.             
  1074.         case shadow:
  1075.             *thekConst = kAEShadow;
  1076.             break;
  1077.             
  1078.         case condense:
  1079.             *thekConst = kAECondensed;
  1080.             break;
  1081.             
  1082.         case extend:
  1083.             *thekConst = kAEExpanded;
  1084.             break;
  1085.     }
  1086. } // StyleTokConst
  1087.  
  1088. OSErr    BuildTypeTextStylesDesc(Style onStyles, Style offStyles, AEDesc *resultDesc)
  1089. {
  1090.  
  1091.     OSErr     myErr;
  1092.     OSErr     ignoreErr;
  1093.     short     myStyleItem;
  1094.     DescType  styleConst;
  1095.     AEDesc    onStylesDesc;
  1096.     AEDesc    offStylesDesc;
  1097.     AEDesc    dataDesc;
  1098.     
  1099.     onStylesDesc.dataHandle  = nil;
  1100.     offStylesDesc.dataHandle = nil;
  1101.     dataDesc.dataHandle  = nil;
  1102.  
  1103.     myErr = AECreateList(nil, 0, true,  &dataDesc);
  1104.     
  1105.     myErr = AECreateList(nil, 0, false, &onStylesDesc);
  1106.     myErr = AECreateList(nil, 0, false, &offStylesDesc);
  1107.     
  1108.     for (myStyleItem = bold; myStyleItem<=extend; myStyleItem = myStyleItem <<1)
  1109.         if (myErr==noErr)
  1110.         {
  1111.             StyleTokConst(myStyleItem, &styleConst);
  1112.             if (myStyleItem & onStyles)
  1113.                 myErr = AEPutPtr(&onStylesDesc,
  1114.                                     0,                // add to end of list
  1115.                                     typeEnumerated, // text for style name
  1116.                                     (Ptr)&styleConst,
  1117.                                     sizeof(styleConst));
  1118.             
  1119.             if (myStyleItem & offStyles)
  1120.                 myErr = AEPutPtr(&offStylesDesc,
  1121.                                     0,                // add to end of list
  1122.                                     typeEnumerated, // text for style name
  1123.                                     (Ptr)&styleConst,
  1124.                                     sizeof(styleConst));
  1125.         }
  1126.     
  1127.     if (myErr==noErr)
  1128.         myErr = AEPutKeyDesc(&dataDesc, keyAEOnStyles,  &onStylesDesc);
  1129.     
  1130.     if (myErr==noErr)
  1131.         myErr = AEPutKeyDesc(&dataDesc, keyAEOffStyles, &offStylesDesc);
  1132.     
  1133.     if (myErr==noErr)
  1134.         myErr = AECoerceDesc(&dataDesc, typeTextStyles, resultDesc);
  1135.         
  1136.     if (onStylesDesc.dataHandle)
  1137.         ignoreErr = AEDisposeDesc(&onStylesDesc);
  1138.         
  1139.     if (offStylesDesc.dataHandle)
  1140.         ignoreErr = AEDisposeDesc(&offStylesDesc);
  1141.         
  1142.     if (dataDesc.dataHandle)
  1143.         ignoreErr = AEDisposeDesc(&dataDesc);
  1144.  
  1145.     return(myErr);
  1146. }
  1147.  
  1148. OSErr    BuildTextStylesDesc(Style theStyle, AEDesc *resultDesc)
  1149. {
  1150.     short     myStyleItem;
  1151.     Style     onStyles;
  1152.     Style     offStyles;
  1153.             
  1154.     onStyles  = 0;
  1155.     offStyles = 0;
  1156.     
  1157.     for (myStyleItem = bold; myStyleItem<=extend; myStyleItem = myStyleItem <<1)
  1158.     {
  1159.         if (myStyleItem & theStyle)
  1160.             onStyles  = onStyles  + myStyleItem;
  1161.         else
  1162.             offStyles = offStyles + myStyleItem;
  1163.     }
  1164.  
  1165.     return(BuildTypeTextStylesDesc(onStyles, offStyles, resultDesc));
  1166.     
  1167. } // BuildTextStylesDesc
  1168.         
  1169. OSErr    BuildStyledTextDesc(TEHandle theHTE, short start, short howLong, AEDesc *resultDesc)
  1170. {
  1171.     AEDesc       listDesc;
  1172.     short        oldSelStart;
  1173.     short        oldSelEnd;
  1174.     StScrpHandle myStScrpHandle;
  1175.     OSErr        myErr;
  1176.     OSErr        ignoreErr;
  1177.     
  1178.     listDesc.dataHandle = nil;
  1179.     
  1180.     oldSelStart = (**theHTE).selStart;
  1181.     oldSelEnd   = (**theHTE).selEnd;
  1182.     
  1183.     TESetSelect(start-1, start+howLong-2, theHTE);
  1184.     
  1185.     myErr = AECreateList(nil, 0, true,  &listDesc);
  1186.     
  1187.     HLock((Handle)(**theHTE).hText);
  1188.                                                      
  1189.     if (myErr == noErr)
  1190.         myErr = AEPutKeyPtr(&listDesc, keyAEText, typeChar,
  1191.                             (Ptr)&(*(**theHTE).hText)[start-1], howLong);
  1192.                                                 
  1193.     HUnlock((Handle)(**theHTE).hText);
  1194.     
  1195.     myStScrpHandle = GetStylScrap(theHTE);
  1196.     
  1197.     if (myStScrpHandle)
  1198.     {
  1199.         HLock((Handle)myStScrpHandle);
  1200.         
  1201.         if (myErr==noErr)
  1202.             myErr = AEPutKeyPtr(&listDesc, keyAEStyles, typeScrapStyles,
  1203.                                     (Ptr)*myStScrpHandle, GetHandleSize((Handle)myStScrpHandle));
  1204.             
  1205.         HUnlock((Handle)myStScrpHandle);
  1206.     }    
  1207.     else
  1208.         myErr = AEPutKeyPtr(&listDesc, keyAEStyles, typeScrapStyles, (Ptr)nil, 0);
  1209.     
  1210.     if (myErr==noErr)
  1211.         myErr = AECoerceDesc(&listDesc, typeStyledText, resultDesc); // should be typeIntlText
  1212.     
  1213.     if (listDesc.dataHandle)
  1214.         ignoreErr = AEDisposeDesc(&listDesc);
  1215.     
  1216.     TESetSelect(oldSelStart, oldSelEnd, theHTE);
  1217.     
  1218.     return(myErr);
  1219. }
  1220.